﻿using System;
using System.Web.Mvc;

namespace LAPI.Web.Controllers.Pista
{
    public class PistaController : BaseController
    {

        #region /Pista/Gestion
        /// <summary>
        /// GET: /Pista/Gestion
        /// </summary>
        /// <returns>View Gestion.cshtml</returns>
        [HttpGet]
        public ActionResult Gestion()
        {
            ActionResult resultado = comprobarErrorPermisoAdminPista();
            if (resultado == null)
            {
                LAPI.Business.DatosSesion datosSesion = (LAPI.Business.DatosSesion)Session["datosSesion"];

                LAPI.Business.Gestores.GestorPistas gestor = new Business.Gestores.GestorPistas();

                return View(gestor.ObtenerTodos(datosSesion.getIdCentroDeportivo()));
            }

            return resultado;
        }
        #endregion

        #region /Pista/Crear

        /// <summary>
        /// GET: /Pista/Crear
        /// </summary>
        /// <returns>View Crear.cshtml</returns>
        [HttpGet]
        public ActionResult Crear()
        {
            ActionResult resultado = comprobarErrorPermisoAdminPista();
            if (resultado == null)
            {
                return View();
            }

            return resultado;
        }

        /// <summary>
        /// POST: /Pista/Crear
        /// </summary>
        /// <param name="model">modelo de Pista</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Crear(LAPI.Data.Model.Pista model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminPista();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos crear
            LAPI.Business.Acciones.AccValidarDatosPista validacion = new Business.Acciones.AccValidarDatosPista();
            resultado = validacion.ValidarDatosCrearPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Creamos
            LAPI.Business.Acciones.AccCrearPista crear = new Business.Acciones.AccCrearPista();
            model.idCentroDeportivo = ((LAPI.Business.DatosSesion)Session["datosSesion"]).getIdCentroDeportivo();
            model.tHoraInicio = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(model.horaInicio);
            model.tHoraFinal = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(model.horaFinal);
            resultado = crear.CrearPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "Pista"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /Pista/Editar

        /// <summary>
        /// GET: /Pista/Editar
        /// </summary>
        /// <param name="id">Identificador único de la pista</param>
        /// <returns>View Editar.cshtml</returns>
        [HttpGet]
        public ActionResult Editar(Int32 id)
        {
            ActionResult resultado = comprobarErrorPermisoAdminPista();
            if (resultado == null && id != 0)
            {
                LAPI.Business.DatosSesion datosSesion = (LAPI.Business.DatosSesion)Session["datosSesion"];

                LAPI.Business.Gestores.GestorPistas gestor = new Business.Gestores.GestorPistas();

                var modelo = gestor.ObtenerPorID(IdPista: id, IdCentroDeportivo: datosSesion.getIdCentroDeportivo());
                modelo.horaInicio = modelo.tHoraInicio.ToShortTimeString();
                modelo.horaFinal = modelo.tHoraFinal.ToShortTimeString();
                return View(modelo);
            }

            return resultado;
        }

        /// <summary>
        /// POST: /Pista/Editar
        /// </summary>
        /// <param name="model">modelo de Pista</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Editar(LAPI.Data.Model.Pista model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminPista();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos realizar el cambio            
            LAPI.Business.Acciones.AccValidarDatosEditarPista validacion = new Business.Acciones.AccValidarDatosEditarPista();
            resultado = validacion.ValidarDatosEditarPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Modificamos los datos
            LAPI.Business.Acciones.AccEditarPista modificar = new Business.Acciones.AccEditarPista();
            model.tHoraInicio = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(model.horaInicio);
            model.tHoraFinal = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(model.horaFinal);
            resultado = modificar.EditarPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "Pista"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /Pista/Eliminar

        /// <summary>
        /// GET: /Pista/Eliminar
        /// </summary>
        /// <param name="id">identificador único de la pista</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Eliminar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminPista();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Eliminamos
            LAPI.Business.Acciones.AccEliminarPista eliminar = new LAPI.Business.Acciones.AccEliminarPista();
            LAPI.Data.Model.Pista model = new LAPI.Data.Model.Pista();
            model.idPista = id;
            resultado = eliminar.EliminarPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }

        #endregion

        #region /Pista/Activar y /Pista/Desactivar

        /// <summary>
        /// GET: /Pista/Activar
        /// </summary>
        /// <param name="id">identificador único de la pista</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Activar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminPista();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Activamos
            LAPI.Business.Acciones.AccEstadoPista activar = new LAPI.Business.Acciones.AccEstadoPista();
            LAPI.Data.Model.Pista model = new LAPI.Data.Model.Pista();
            model.activo = true;
            model.idPista = id;
            resultado = activar.ActivarPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }

        /// <summary>
        /// GET: /Pista/Desactivar
        /// </summary>
        /// <param name="id">identificador único de la pista</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Desactivar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminPista();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Desactivamos
            LAPI.Business.Acciones.AccEstadoPista desactivar = new LAPI.Business.Acciones.AccEstadoPista();
            LAPI.Data.Model.Pista model = new LAPI.Data.Model.Pista();
            model.activo = false;
            model.idPista = id;
            resultado = desactivar.DesactivarPista(datosPista: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }

        #endregion

        #region Filtros Búsqueda

        /// <summary>
        /// POST: /Pista/Buscar
        /// </summary>
        /// <param name="idpistaFilter">Filtro por identificador</param>
        /// <param name="descripcionFilter">Filtro por descripcion</param>
        /// <returns>_ListadoPista.cshtml</returns>
        [HttpPost]
        public ActionResult Buscar(String idpistaFilter, String descripcionFilter)
        {

            ActionResult resultado = comprobarErrorPermisoAdminPista();
            if (resultado == null)
            {
                LAPI.Business.Gestores.GestorPistas gestor = new Business.Gestores.GestorPistas();

                //Creamos el filtro con los parametros posibles
                System.Collections.Hashtable filtro = new System.Collections.Hashtable();
                if (!String.IsNullOrEmpty(idpistaFilter))
                    filtro.Add("idpista", idpistaFilter);
                if (!String.IsNullOrEmpty(descripcionFilter))
                    filtro.Add("descripcion", descripcionFilter);

                LAPI.Business.DatosSesion datosSesion = (LAPI.Business.DatosSesion)Session["datosSesion"];

                return PartialView("_ListadoPista", gestor.ObtenerBusqueda(filtroBusqueda: filtro, idCentroDeportivo: datosSesion.getIdCentroDeportivo()));
            }

            return resultado;
        }

        #endregion

        /*################## SERVICIOS ##################*/

        #region /Pista/getPistaDeporte
        /// <summary>
        /// GET: /Pista/getPistaDeporte
        /// </summary>
        /// <param name="idCentroDeportivo">identificador único del centro deportivo</param>
        /// <param name="idDeporte">identificador único del deporte</param>
        /// <returns>String con el json de la respuesta</returns>
        [HttpGet]
        public String getPistaDeporte(Int32 idCentroDeportivo, Int32 IdDeporte)
        {
            LAPI.Business.Acciones.AccGetPista getter = new Business.Acciones.AccGetPista();

            var items = getter.GetPistaDeporte(IdCentroDeportivo: idCentroDeportivo, IdDeporte: IdDeporte);

            return LAPI.Data.Model.Pista.toJson(items);
        }

        #endregion

    }
}
